package com.example.sqliteprueba;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.example.sqliteprueba.MainActivity.Holder;
import com.example.sqliteprueba.MainActivity.MiAdaptador;

import android.app.Activity;
import android.app.ListActivity;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.NavUtils;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class ConsumosActivity extends ListActivity {

	private CargaDAO datasource;
	private MiAdaptador adapter;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_consumos);
		// habilitar la action bar
		getActionBar().setDisplayHomeAsUpEnabled(true);

		datasource = new CargaDAO(this);
		int cantidadDeMeses = 4;
		ArrayList<Carga> cargas = (ArrayList<Carga>) datasource.obtenerCargas(
				new Date(), cantidadDeMeses);

		ArrayList<CargaConsumoFacade> listaFacade = new ArrayList<CargaConsumoFacade>();
		boolean primerTanqueLleno = false;
		float kmsAcumulador = 0;
		float litrosAcumulador = 0;
		float dineroAcumulador = 0;
		float kmsUltimaCargaLlena = 0;
		// float litrosUltimaCarga = 0;
		// float dineroUltimaCarga = 0;

		for (int i = 0; i < cargas.size(); i++) {
			Carga carga = cargas.get(i);
			if (!primerTanqueLleno) {
				// 1
				// Si todavia no ha aparecido el primer tanque lleno... verifico
				// a continuacion si esta carga es tanque lleno.
				if (carga.isTanqueLleno()) {
					// Si es tanque lleno, guardo los valores en la variable
					// de kmsUltimaCargaLlena
					primerTanqueLleno = true;
					kmsUltimaCargaLlena = carga.getKm();
					// litrosUltimaCarga = carga.getLitrosCargados();
					// dineroUltimaCarga = carga.getPrecio();
				}
			} else {
				// Si primerTanqueLleno=true, significa que ya se ha guardado el
				// valor por el tanque lleno y que las variables ***UltimaCarga
				// ya estan inicializadas.
				// Entonces pregunto si la carga actual es tanque lleno o no.
				if (carga.isTanqueLleno()) {
					// 3
					// Si la carga actual es tanqueLleno, saco los calculos y
					// agrego un elemento CargaConsumoFacade a la lista

					// Saco los calculos acumulados
					kmsAcumulador += (carga.getKm() - kmsUltimaCargaLlena);
					litrosAcumulador += carga.getLitrosCargados();
					dineroAcumulador += carga.getPrecio();

					// Creo un nuevo objeto Facade y lo agrego.
					CargaConsumoFacade cargaFacade = new CargaConsumoFacade();
					cargaFacade.setFecha(carga.getFecha());
					cargaFacade.setKm(kmsAcumulador);
					cargaFacade.setPrecio(dineroAcumulador);
					cargaFacade.setLitrosCargados(litrosAcumulador);
					cargaFacade.setKmsXLitro(kmsAcumulador / litrosAcumulador);
					cargaFacade.setPrecioXKms(dineroAcumulador / kmsAcumulador);

					listaFacade.add(cargaFacade);

					// Reinicio los acumuladores. Y seteo los KMS de la ultima
					// carga
					kmsAcumulador = 0;
					litrosAcumulador = 0;
					dineroAcumulador = 0;
					kmsUltimaCargaLlena = carga.getKm();

				} else {
					// 2
					// Si la variable actual no es tanque lleno. Acumulo
					// solamente.

					// kmsAcumulador += (carga.getKm() - kmsUltimaCarga);
					// kmsUltimaCarga = carga.getKm();
					litrosAcumulador += carga.getLitrosCargados();
					dineroAcumulador += carga.getPrecio();

				}
			}
		}

		adapter = new MiAdaptador(this, listaFacade);
		setListAdapter(adapter);

		// List<Carga> cargas = datasource.getAllCargas();
		// adapter = new MiAdaptador(this, cargas);
		// setListAdapter(adapter);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.menu_consumos, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		// int id = item.getItemId();
		// if (id == R.id.action_settings) {
		// return true;
		// }
		// return super.onOptionsItemSelected(item);

		switch (item.getItemId()) {
		// Respond to the action bar's Up/Home button
		case android.R.id.home:
			// Intent i = new Intent(this, MainActivity.class);
			// startActivity(i);
			// overridePendingTransition(R.anim.fade_in, R.anim.fade_out);

			NavUtils.navigateUpFromSameTask(this);
			// overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
			overridePendingTransition(android.R.anim.fade_in,
					android.R.anim.fade_out);
			return true;
		}
		return super.onOptionsItemSelected(item);
	}

	/*************************************************
	 * << INICIO DEL CODIGO QUE MANEJA LA LISTA >>>
	 ************************************************/
	class Holder {// Clase encargada de manjeter una referencia a los elementos
		// de un layout (la linea) en un objeto holder (ose aun
		// objeto de sta clase) en un momento determinado (osea en
		// una view en el objeto Tag)
		// private long id;
		private TextView txtFecha;
		private TextView txtKms;
		private TextView txtPrecioLitro;
		private TextView txtLitros;
		private TextView txtKmsXLitros;
		private TextView txtPrecioXKms;

	}

	public class MiAdaptador extends BaseAdapter {
		private final Activity actividad;
		private final List<CargaConsumoFacade> lista;

		public MiAdaptador(Activity actividad, List<CargaConsumoFacade> lista) {
			super();
			this.actividad = actividad;
			this.lista = lista;
		}

		/**
		 * position: es un numero que representa la linea de la que se va a
		 * devolver el View. convertView: Es la view que actualmente se
		 * encuentra en esa linea. Hay que tener en cuenta que si en la pantalla
		 * se pueden ver 12 lineas, solamente se van a retornar constantemente
		 * esas 12 view. (Salvo cuando se gire la pantalla. Cada vez que se
		 * fgire se vuelven a crear todas las views de nuevo, pero sino se
		 * reutilizan las mismas 12 por siempre.) parent: contenedor de vistas
		 * donde el objeto va a ser a�adido (?) (WTF)
		 */
		public View getView(int position, View convertView, ViewGroup parent) {
			Holder holder;

			if (convertView == null) {// Si la view que actualmente se encuentra
										// en esa posicion es NULL significa que
										// se esta dezplazando para abajo y que
										// es un item nuevo que nunca se ha
										// visto. Osea que esa linea nunca se ha
										// seteado.
				// verificacion de cuantas VIew se crearon

				// Creo la linea del item basandome en el layout
				// item_perosnalizado
				LayoutInflater inflater = LayoutInflater
						.from(ConsumosActivity.this);
				convertView = inflater.inflate(R.layout.item_lista_consumo,
						null);

				// Creo una nueva clase Holder, le seteo los elementos del
				// layout y luego se la asigno al elemento Tag de la View (que
				// esta referenciada por el objeto contentView)
				holder = new Holder();
				holder.txtFecha = (TextView) convertView
						.findViewById(R.id.txtFecha);
				holder.txtKms = (TextView) convertView
						.findViewById(R.id.txtKms);
				holder.txtPrecioLitro = (TextView) convertView
						.findViewById(R.id.txtPrecio);
				holder.txtLitros = (TextView) convertView
						.findViewById(R.id.txtLitros);
				holder.txtKmsXLitros = (TextView) convertView
						.findViewById(R.id.txtKmsXL);
				holder.txtPrecioXKms = (TextView) convertView
						.findViewById(R.id.txtPrecioXKms);

				convertView.setTag(holder);
			} else {// Si la view no es NULL significa que esta volviendo hacia
					// arriba, y eso quiere decir que esta volviendo sobre una
					// linea que ya paso. Osea que ya existe. Osea que la view
					// tiene en su objeto Tag el objeto de la clase Holder
					// asignado con todos los elementos de la view
					// referenciados.
				holder = (Holder) convertView.getTag();
			}

			// Aca lo que hago es modificar directamente los objetos que se
			// encuentren en el objeto de la clase Holder. Ya que estos hacen
			// referencia a los objetos del layout.
			CargaConsumoFacade carga = lista.get(position);
			SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
			holder.txtFecha.setText(sdf.format(carga.getFecha()));
			holder.txtKms.setText(formatearFloat(carga.getKm()));
			holder.txtPrecioLitro.setText(formatearFloat(carga.getPrecio()));
			holder.txtLitros.setText(formatearFloat(carga.getLitrosCargados()));
			holder.txtKmsXLitros.setText(formatearFloat(carga.getKmsXLitro()));
			holder.txtPrecioXKms.setText(formatearFloat(carga.getPrecioXKms()));
			
//			holder.txtFecha.setBackgroundColor(Color.rgb(245, 188, 169));
//			holder.txtKms.setBackgroundColor(Color.rgb(145, 188, 169));
//			holder.txtPrecioLitro.setBackgroundColor(Color.rgb(45, 188, 169));
//			holder.txtLitros.setBackgroundColor(Color.rgb(245, 88, 169));
//			holder.txtKmsXLitros.setBackgroundColor(Color.rgb(245, 188, 69));
//			holder.txtPrecioXKms.setBackgroundColor(Color.rgb(245, 88, 169));
			
			
			registerForContextMenu(convertView);
			return convertView;
		}

		/*
		 * public View getView(int position, View convertView, ViewGroup parent)
		 * { // creo un objeto View a partir del layout item_personalizado
		 * LayoutInflater inflater = actividad.getLayoutInflater(); View view =
		 * inflater.inflate(R.layout.item_personalizado, null, true);
		 * 
		 * MainActivity.cantidadDeViewsCreadas++; Log.e("LogsAndroid",
		 * String.valueOf(cantidadDeViewsCreadas));
		 * 
		 * // String LOGTAG = "LogsAndroid"; // Log.e(LOGTAG,
		 * "Mensaje de error"); // Log.w(LOGTAG, "Mensaje de warning"); //
		 * Log.i(LOGTAG, "Mensaje de informaci�n"); // Log.d(LOGTAG,
		 * "Mensaje de depuraci�n"); // Log.v(LOGTAG, "Mensaje de verbose");
		 * 
		 * // modifico el texto del Textview TextView textView = (TextView)
		 * view.findViewById(R.id.titulo);
		 * textView.setText(lista.elementAt(position));
		 * 
		 * // Se crea un numero Random y deacuerdo a ese numero se asigna una //
		 * imagen al ImageView con ID icono ImageView imageView = (ImageView)
		 * view.findViewById(R.id.icono); switch (Math.round((float)
		 * Math.random() * 3)) { case 0:
		 * imageView.setImageResource(android.R.drawable.ic_menu_day); break;
		 * case 1: imageView.setImageResource(android.R.drawable.ic_menu_call);
		 * break; default:
		 * imageView.setImageResource(android.R.drawable.arrow_up_float); break;
		 * }
		 * 
		 * // Se retorna una imagen return view; }
		 */

		public String formatearFloat(float valor) {
			String aux = new DecimalFormat("#.##").format(valor);
			if (aux.endsWith(".00")) {
				aux = aux.replaceAll("\\.?0*$", "");
			}
			return aux;
		}

		public int getCount() {
			return lista.size();
		}

		public Object getItem(int position) {
			return lista.get(position);
		}

		public long getItemId(int position) {
			return position;
		}

		public void agregar(CargaConsumoFacade carga) {
			lista.add(carga);
		}

		public void eliminar(CargaConsumoFacade carga) {
			lista.remove(carga);
		}
	}

	/*************************************************
	 * << FIN DEL CODIGO QUE MANEJA LA LISTA >>>
	 ************************************************/
}
